COPY
컴퓨터를 사용하다 보면 데이터 파일을 플로피디스크에서 하드디스크로 복사하거나 혹은 하드디스크 상에서 다른 디렉토리로 복사하는 경우가 있다. 이처럼 파일을 복사하기 위하여 사용하는 명령어로 COPY와 Xcopy 명령어가 있는데, 두 명령어는 상당한 차이를 보인다.
예를 들어, COPY는 Command.com에 의하여 자체적으로 처리되는 내부 명령어로 파일 단위로 복사를 실행하고, Xcopy는 실행 파일로 구성된 외부 명령어로 버퍼 단위로 복사를 실행한다.
따라서 다수의 파일을 복사하는데는 Xcopy 명령어가 비교적 빠르게 수행되고, 특히 서브 디렉토리까지 한꺼번에 복사하고자 하는 경우에는 반드시 Xcopy 명령어를 사용한다. 그러나, Xcopy 명령어는 2개 이상의 파일을 하나로 결합하기 위하여 사용할 수 없다는 제약이 있다. 즉, COPY 명령어는 파일을 복사하는 이외의 기능으로 파일을 결합하는 기능을 가지고 있다.
도스에서는 파일을 목적지로 복사할 때 목적지에 동일한 이름의 파일이 있으면 원본 파일로 목적지 파일을 대체할 것인가를 확인하기 위하여 사용자에게 프롬프트하도록 지정하는 옵션이 있다. 또한, 이 옵션을 환경 변수로 지정하여 항상 목적지 파일을 대체할 때 사용자에게 확인하도록 설정할 수 있다.
도스에서는 파일을 복사할 때 각각의 파일명이 화면에 나타난다.
만약, 파일을 목적지로 복사하고 원본 파일을 삭제하려면 Move 명령어를 사용한다.
■ 명령어 위치
Command.com에 포함된 내부 명령어
■ 사용법
COPY [/Y|/-Y] source destination [/V] [/N]
2개 이상의 파일을 결합하여 하나의 파일로 만들려면 다음과 같이 COPY 명령어를 사용한다.
COPY [/Y|/-Y] [/A|/B] source [/A|/B] [+....] destination [/A|/B] [/V]
■ 옵션 및 매개변수

/y | 이 옵션은 파일을 목적지로 복사할 때 원본 파일로 목적지 파일을 대체하기 위해 사용하는 것으로, 같은 이름의 파일이 있으면 묻지 않고 덮어 쓴다.
/-y | 이 옵션은 파일을 목적지로 복사할 때 원본 파일과 동일한 이름을 가진 파일이 목적지에 있을 때, 이를 대체할 것인가를 사용자에게 확인하도록 하기 위해 사용한다. 만약, 항상 목적지 파일을 대체하기 전에 사용자에게 확인하도록 하려면 SET 명령을 사용하여 COPYCMD 환경 변수를 설정할 수 있다.
Source | 복사할 파일의 경로와 이름을 지정한다. Source는 원본 드라이브, 디렉토리, 파일명으로 구성되어 있다. 즉, [drive:][path] filename으로 구성되어 있다. 다수의 파일을 복사하기 위하여 일련의 파일군을 지정하려면 와일드 카드(* 혹은 ?)를 사용한다.
destination | 파일을 복사할 경로 즉, 목적지를 지정한다. 만약 목적지를 지정하지 않으면 현행 디렉토리에 원본 파일과 같은 이름으로 복사한다. 다른 이름으로 복사하려면 파일명을 다른 이름으로 지정한다. 목적지도 와일드 카드를 사용할 수 있다.
/a | 아스키 파일(텍스트 파일)을 의미한다. /a 옵션이 명령어 라인의 파일명보다 앞에 나오는 경우에는 /a 옵션 뒤에 나오는 모든 파일에 적용된다. 이 경우 중간에 /b 옵션을 만나는 경우, /b 옵션 다음에 오는 파일은 모두 이진 파일로 간주된다. 파일명 뒤에 /a 옵션이 오는 경우에는 옵션에 선행하는 파일과 다음에 /b 옵션이 오기 전까지의 모든 파일에 적용된다. 이 경우 /b 옵션은 선행하는 파일과 다음에 오는 파일에 적용된다. 텍스트 파일은 파일의 끝을 지정하기 위하여 EOF(End Of File) 문자(Ctrl+Z)를 사용할 수 있는데, 파일을 결합하는 경우에는 COPY 명령어는 파일을 디폴트로 텍스트 파일로 취급한다.
/b | 이진 파일을 의미한다. /b 옵션도 위의 /a 옵션과 마찬가지로 파일명의 앞에 사용되는 경우에는 다음에 오는 모든 파일에 적용된다. 즉, 적용의 방법은 /a와 동일하다. /b 옵션은 명령어 해석기인 Command.com이 디렉토리에서 파일 크기에 의해 지정된 바이트의 숫자를 읽도록 지정한다. /b 옵션은 COPY 명령어를 이용하여 파일을 결합시키지 않는 한 디폴트 값으로 사용된다.
/v | 목적지로 파일을 복사한 후 정확하게 복사되었는지를 검사하도록 하기 위해 이 옵션을 사용한다. 이 옵션을 사용하는 경우 정확하게 복사되지만 복사 속도는 느려진다.

■ 참고 사항
☞ COPY 명령의 환경 변수 지정하기
도스에서는 목적지에 원본 파일과 동일한 이름을 가진 파일이 있는 경우에 이를 대체할 것인가를 사용자에게 확인할 수 있는 옵션을 제공한다.
만약, 원본 파일로 목적지 파일을 대체하기 전에 사용자에게 대체 확인을 위한 메시지를 디스플레이하도록 하려면 SET 명령어를 사용하여 COPY 명령어의 환경 변수를 지정할 수 있다.
파일을 복사할 때마다 항상 확인할 필요가 있는 경우에는 Autoexec.bat 파일에 다음과 같이 COPY 명령의 환경 변수를 지정할 수 있다.
set copycmd=/-y
위와 같이 COPY 명령어의 환경 변수를 지정한 경우에는 파일을 복사 혹은 이동하기 위하여 사용하는 모든 명령어 즉, Copy, Move, Xcopy 등에 모두 적용된다. 따라서, COPYCMD 환경 변수의 지정은 단순히 COPY 명령어에만 국한되는 것이 아니라 파일의 복사와 이동에 모두 적용된다는 것이다.
만약, COPYCMD 환경 변수를 목적지 파일을 대체할 때 사용자에게 확인하지 않도록 변경하려면 다음과 같이 SET 명령어를 사용한다.
set copycmd=/y
☞ 주변 장치 지정하기
COPY 명령어는 원본이나 목적지를 파일명으로 하는 대신에 주변 장치로 입출력할 수 있다. 즉, 원본으로 키보드를 지정하거나 목적지로 프린터 포트를 지정함으로써 출력 방향을 변경하는 것이다. 원본이나 목적지를 주변장치로 지정하는 경우에는 장치명만을 지정하면 된다. 예를 들어, 키보드로부터의 입력을 LPT1에 연결된 프린터로 인쇄하려면 다음과 같이 COPY 명령어를 사용한다.
copy con lpt1
위와 같이 COPY 명령어를 사용하면 DOS는 해당 입력을 받아들일 준비를 하고 입력 커서를 프롬프트한다. 사용자가 원하는 문자열을 모두 지정하였으면 키보드 상에서 <F6>을 누르거나 <Ctrl+Z>를 누름으로써 프린터로 데이터가 보내진다. 많은 문자열을 지정하는 경우에는 자동으로 스크롤되고, EOF가 입력되기 전까지의 데이터는 버퍼에 저장된다.
COPY 명령어에서 원본이나 목적지로 지정할 수 있는 주변 장치는 컴퓨터에 설치되어 있는 장치에 따라 달라지는데, 일반적으로 CON, PRN, LPT1∼LPT3, COM1∼COM4, AUX, 등이 있다. CON은 키보드를 의미하는 것으로 원본으로만 지정할 수 있고, 기타 다른 주변 장치는 연결된 장치에 따라 원본이나 목적지로 지정할 수 있다.
예를 들어, 프린터 포트에 연결하여 사용하는 하드디스크의 경우에는 원본과 목적지로 사용될 수 있지만 프린터 포트에 프린터가 연결되어 있는 경우에는 목적지로만 사용할 수 있을 것이다.
☞ 디폴트 목적지 파일
목적지 파일을 지정하지 않으면 원래의 파일과 같은 파일명, 날짜, 시간을 가진 복사본을 만들어 현행 드라이브 상의 현행 디렉토리에 복사한다. 만약, 원본 파일이 현행 디렉토리에 있는 경우에 목적지 파일을 복사할 디렉토리나 드라이브를 지정하지 않은 경우에는 COPY 명령어는 중단되고 다음과 같은 메시지가 나타난다.
File cannot be copied onto itself
0 file(s) copied
☞ /v 옵션 사용하기
파일을 복사할 때 기록을 위한 구동을 확인할 수 없다면, 에러 메시지가 나타난다. 비록 COPY 명령어에서는 기록 에러가 거의 발생하지는 않지만 /v 옵션을 지정한 경우에는 데이터가 정확히 기록되었는가를 확인할 수 있다.
그러나 /v 옵션의 사용은 COPY 명령어의 실행 속도를 느리게 한다. 이것은 디스크에 기록된 각각의 섹터를 점검하기 때문이다. 그럼에도 불구하고 중요한 데이터일 경우에는 반드시 /v 옵션을 지정하는 것이 바람직하다.
☞ 서브디렉토리에 있는 파일 복사하기
원본 디렉토리에 있는 모든 파일과 원본 디렉토리의 서브디렉토리에 있는 모든 파일을 한꺼번에 복사하는 옵션은 제공되지 않는다. 만약, 서브디렉토리까지 한꺼번에 복사하려면 Xcopy 명령어를 사용한다.
☞ 0 바이트(zero length) 파일 복사하기
비어 있는 디렉토리는 파일의 길이가 0 바이트로 표시된다. 이처럼 0 바이트의 길이를 갖는 파일은 COPY 명령어를 사용하여 복사할 수 없다. 0 바이트의 파일을 복사하려면 Xcopy 명령어와 널(NUL) 문자를 사용한다.
☞ 파일의 시간과 날짜 변경하기
파일의 내용은 수정하지 않고, 파일에 시스템의 현재 시간과 날짜를 할당하려면 다음과 같은 형식으로 COPY 명령어를 사용한다. 여기에서 연속되는 2개의 콤마(,)는 목적지의 생략을 가리킨다.
copy /b source+,,
■ 사용 예
다음의 COPY 명령어는 원본 파일을 복사하고 파일을 복사하고, 반드시 목적지 파일의 마지막에 EOF 문자를 추가한다. 이것은 워드프로세서나 기타 편집기에서 아스키 파일로 저장하는 경우에 파일의 마지막에 EOF 문자를 추가하는 것과 같은 효과가 있다.
copy abc.txt def.txt /a
현행 디렉토리에서 readme.doc 파일을 C드라이브에 있는 WORDDATA 디렉토리에 복사하려면 다음과 같이 COPY 명령어를 사용한다.
copy readme.doc c:\worddata
위의 예에서 만약 C드라이브에 WORDDATA라는 디렉토리가 없다면, 원본 파일 readme.doc을 C드라이브의 루트 디렉토리에 worddata라는 파일명으로 복사한다.
다수의 파일을 하나의 파일로 결합하려면 파일의 모든 이름을 명령어 프롬프트 라인에 원본 매개변수처럼 열거한다. 열거할 때 각각의 원본 파일은 + 기호로 구분한다. 다음은 ABC.TXT, DEF.TXT, GHI.TXT 파일을 ABCDEF.TXT 파일로 결합하는 예이다.
copy abc.txt+def.txt+ghi.txt abcdef.txt
위의 예에서 결합된 파일의 날짜와 시간은 현재 시스템의 날짜와 시간으로 할당된다. 만약, 파일을 결합할 목적지 파일을 지정하지 않은 경우에는 원본 파일의 첫 번째 파일로 할당한다.
다음은 ABC.TXT, DEF.TXT, GHI.TXT 파일을 ABC.TXT 파일로 결합하는 예이다.
copy abc.txt+def.txt+ghi.txt
TXT라는 확장자를 가진 모든 파일을 하나의 파일로 결합하기 위하여 와일드 카드를 사용할 수 있다.
다음은 TXT 확장자를 갖는 모든 파일을 REPORTS.DOC 파일로 결합하는 예이다.
copy *.txt reports.doc
위의 예는 아스키 파일을 결합하는 예이다. 따라서 각 원본 파일의 처음에 나오는 EOF까지 결합된다. 그러나, 다수의 EOF가 포함된 파일을 결합하는 경우에는 이진 파일 형식으로 파일을 결합하여야 한다.
다음은 다수의 EOF 문자를 포함한 아스키 파일을 제외되는 부분이 없이 전부 결합하기 위하여 사용하는 방법이다.
copy /b *.txt reports.doc
위의 예에서 원본 파일이 아스키 파일인 경우에도 이진 파일로 취급하도록 하면 Ctrl+Z를 EOF 문자로 취급하지 못하도록 막아 줌으로써 제외되는 부분이 없어진다.
실행 파일인 EXE 파일은 이진 파일로 구성되어 있는데, 이처럼 이진 파일로 이루어진 파일도 COPY 명령어를 이용하여 결합할 수 있다.
다음은 와일드 카드를 사용하여 현행 디렉토리의 이진 파일인 EXE 확장자를 갖는 모든 파일을 COMBIN.EXE 파일로 결합하는 예이다.
copy /b *.exe combin.exe
위의 예에서 다수의 EXE 파일을 결합하는 경우에는 각 원본 파일의 내부 형식의 상이함으로 인하여 실행되지 않을 수 있다.
다음의 예는 TXT 확장자를 갖는 파일을 같은 이름을 갖는 REF 파일에 결합하고, 결합한 파일을 같은 이름의 DOC 확장자를 가진 파일로 만들도록 하는 명령이다. 즉, FILE1.TXT와 FILE1.REF를 결합하여 FILE1.DOC 파일을 만들고, FILE2.TXT와 FILE2.REF를 결합하여 FILE2.DOC 파일을 만든다. 이런 식으로 계속하여 FILEn.TXT와 FILEn.REF를 결합하여 FILEn.DOC 파일을 만들 때까지 계속 반복한다.
copy *.txt+*.ref *.doc
위의 경우와는 달리 현행 디렉토리에 있는 모든 TXT 파일과 REF 파일을 하나의 파일인 TOTAL.DOC로 결합하려면 다음과 같이 COPY 명령어를 사용한다.
copy *.txt+*.ref total.doc